#include "onewire.h"
#include <STC15F2K60S2.H>
#include "intrins.h"

sbit DQ = P1 ^ 4;

//
void Delay4us()		//@12.000MHz
{
	unsigned char i;

	_nop_();
	_nop_();
	i = 9;
	while (--i);
}


void Delay_OneWire(unsigned int t)
{
	unsigned char i;
	while (t--)
	{
		for (i = 0; i < 12; i++);
	}
}

//
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for (i = 0; i < 8; i++)
	{
		DQ = 0;
		DQ = dat & 0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;

	for (i = 0; i < 8; i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		Delay4us();//加4us延迟，防止温度乱跳
		if (DQ)
		{
			dat |= 0x80;
		}
		Delay_OneWire(5);
	}
	return dat;
}

//
bit init_ds18b20(void)
{
	bit initflag = 0;

	DQ = 1;
	Delay_OneWire(12);
	DQ = 0;
	Delay_OneWire(80);
	DQ = 1;
	Delay_OneWire(10);
	initflag = DQ;
	Delay_OneWire(5);

	return initflag;
}


float rd_Tempture(void)
{
	unsigned char low,high;
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0x44);
	init_ds18b20();
	Write_DS18B20(0xcc);
	Write_DS18B20(0xbe);
	low=Read_DS18B20();
	high=Read_DS18B20();
	return (high<<8 |low)/16.0;
}



//float rd_temperature()
//{
//	unsigned char low, high;
//	init_ds18b20();
//	Write_DS18B20(0xcc);
//	Write_DS18B20(0x44);
//	init_ds18b20();
//	Write_DS18B20(0xcc);
//	Write_DS18B20(0xbe);
//	low = Read_DS18B20();
//	high = Read_DS18B20();
//	return ((high << 8) | low) / 16.0;
//}